package com.simple.common.entity.po.sys;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.io.BaseEncoding;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.simple.common.framework.scale.Scale;
import lombok.Data;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.math.BigDecimal;

/**
 * 渠道的组合对象最终支付使用这个
 * @author yasud
 * @date 2020年11月09日 10:57
 * @description
 */
@Data
public class ChannelComp implements Serializable {

    /**
     * 渠道id
     */
    private Long id;

    /**
     * 渠道对象
     */
    private Channel channel;

    /**
     * 渠道商户
     */
    private ChannelMerchant channelMerchant;

    /**
     * 渠道商户id
     */
    private Long channelMerchantId;

    /**
     * code
     */
    private String code;

    /**
     * 渠道名称
     */
    private String name;

    /**
     * 渠道商户号
     */
    private String mid;

    /**
     * 渠道秘钥
     */
    private String secretKey;

    /**
     * 终端编号
     */
    private String terminalNo;

    /**
     * 同步跳转地址 一般指 ，成功调换，但存在失败跳转
     * 这里实际上不应该存在 同步和异步跳转地址的配置因为现在都有统一 处理
     */
    private String syncUrl;

    /**
     * 异步回调地址
     */
    private String asyncUrl;

    /**
     * 渠道标识。用户在渠道后台配置回调地址的标识
     */
    private String channelFlag;

    /**
     * 渠道正常情况返回的消息
     */
    private String channelNotifyOkRes;

    /**
     * 是否启用
     */
    private Boolean enable;

    /**
     * 支付参数拓展 json, 这里是单个对象
     */
    private String payConfigExtra;

    /**
     * 服务提供者
     */
    private String serviceProvider;

    @JsonIgnore
    public String getAsString(String key) {
        JsonObject asJsonObject = extraAsJson();
        return asJsonObject.getAsJsonPrimitive(key).getAsString();
    }

    @JsonIgnore
    private JsonObject extraAsJson() {
        JsonElement jsonElement = JsonParser.parseString(payConfigExtra);
        return jsonElement.getAsJsonObject();
    }

    @JsonIgnore
    public BigDecimal getAsBigDecimal(String key) {
        JsonObject asJsonObject = extraAsJson();
        return Scale.scale(asJsonObject.getAsJsonPrimitive(key).getAsBigDecimal());
    }

    @JsonIgnore
    public int getAsInt(String key) {
        JsonObject asJsonObject = extraAsJson();
        return asJsonObject.getAsJsonPrimitive(key).getAsInt();
    }

    @JsonIgnore
    public InputStream getAsInputStream(String key) {
        JsonObject asJsonObject = extraAsJson();
        String asString = asJsonObject.getAsJsonPrimitive(key).getAsString();
        return new ByteArrayInputStream(BaseEncoding.base64().decode(asString));
    }
}
